package com.example.synccenter.feishu;

import com.example.synccenter.entity.SyncTaskEntity;
import com.example.synccenter.service.SyncTaskService;
import com.example.synccenter.identitysource.core.IdentitySource;
import com.example.synccenter.identitysource.core.IdentitySourceConfig;
import com.example.synccenter.identitysource.core.IdentitySourcePostProcessor;
import com.example.synccenter.identitysource.core.IdentitySourceClient;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 飞书身份源实现，组合客户端和后处理器，实现同步与事件处理能力。
 */
public class FeishuIdentitySource implements IdentitySource<FeishuConfig> {
    /** 身份源名称 */
    private final String name;
    /** 飞书身份源配置 */
    private final FeishuConfig config;
    /** 飞书客户端 */
    private final IdentitySourceClient client;
    /** 用户后处理器 */
    private final IdentitySourcePostProcessor userPostProcessor;
    /** 部门后处理器 */
    private final IdentitySourcePostProcessor deptPostProcessor;
    /** 事件后处理器 */
    private final IdentitySourcePostProcessor eventPostProcessor;
    /** 同步任务服务 */
    private final SyncTaskService syncTaskService;

    /**
     * 构造方法
     * @param id 身份源ID
     * @param name 身份源名称
     * @param config 配置
     * @param client 客户端
     * @param userPostProcessor 用户后处理器
     * @param deptPostProcessor 部门后处理器
     * @param eventPostProcessor 事件后处理器
     * @param syncTaskService 同步任务服务
     */
    public FeishuIdentitySource(String id, String name, FeishuConfig config,
                                IdentitySourceClient client,
                                IdentitySourcePostProcessor userPostProcessor,
                                IdentitySourcePostProcessor deptPostProcessor,
                                IdentitySourcePostProcessor eventPostProcessor,
                                SyncTaskService syncTaskService) {
        this.name = name;
        this.config = config;
        this.client = client;
        this.userPostProcessor = userPostProcessor;
        this.deptPostProcessor = deptPostProcessor;
        this.eventPostProcessor = eventPostProcessor;
        this.syncTaskService = syncTaskService;
    }

    /**
     * 获取身份源名称
     * @return 名称
     */
    @Override
    public String getName() {
        return name;
    }

    /**
     * 获取身份源配置
     * @return 配置
     */
    @Override
    public FeishuConfig getConfig() {
        return config;
    }

    /**
     * 执行同步操作，依次同步用户和部门数据，并调用对应后处理器，同时写入同步任务记录。
     * @param context 同步上下文
     */
    @Override
    public void sync(Map<String, Object> context) {
        client.connect();
        // 写入同步任务记录
        String taskId = UUID.randomUUID().toString();
        if (syncTaskService != null) {
            SyncTaskEntity task = new SyncTaskEntity();
            task.setId(taskId);
            task.setSourceId(config.getId());
            task.setTriggerType((String) context.getOrDefault("triggerType", "SCHEDULED"));
            task.setStartTime(LocalDateTime.now());
            task.setEndTime(LocalDateTime.now());
            task.setStatus("成功");
            task.setErrorMessage(null);
            task.setDuration(0L);
            syncTaskService.save(task);
        }
        // 传递taskId、sourceId到后处理器
        Map<String, Object> newContext = new HashMap<>(context);
        newContext.put("taskId", taskId);
        newContext.put("sourceId", config.getId());
        newContext.put("sourceType", "FEISHU");
        newContext.put("sourceUserId", "feishu-user-id");
        newContext.put("sourceDeptId", "feishu-dept-id");
        Map<String, Object> userData = client.getUserData();
        userPostProcessor.process(userData, newContext);
        Map<String, Object> deptData = client.getDeptData();
        deptPostProcessor.process(deptData, newContext);
    }

    /**
     * 处理事件（如回调事件）
     * @param context 事件上下文
     * @return 处理结果
     */
    @Override
    public Object event(Map<String, Object> context) {
        return client.handleEvent(context);
    }
} 